// 给定一个数组 candidates 和一个目标数 target ，找出 candidates 中所有可以使数字和为 target 的组合。

// candidates 中的每个数字在每个组合中只能使用一次。

// 注意：解集不能包含重复的组合。
var combinationSum2 = function(candidates, target) {
    const res = [];
    candidates.sort((a, b) => { return a - b });
    const getnum = (st, arr, sum) => {
        if (sum >= target) {
            if (sum == target) {
                res.push(arr.slice());
                // 浅拷贝，原数组之后仍要操作
            }
            return;
        }
        for (let i = st; i < candidates.length; i++) {
            if (i - 1 >= st && candidates[i - 1] == candidates[i]) { // 当前选项和左邻选项一样，跳过
                continue;
            }
            arr.push(candidates[i]);
            getnum(i + 1, arr, sum + candidates[i]);
            arr.pop();
        }
    }
    getnum(0, [], 0);
    return res;
};